package com.atguigu.lease.common.converter;

import com.atguigu.lease.model.enums.BaseEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

//ConverterFactory:转换器工厂的父接口， 泛型1：转换器接受到参数，泛型2：转换器要转换的目标类型 handler方法要接受的类型
@Component //将转换器工厂注入到IOC容器中
public class BaseEnumConverterFactory implements ConverterFactory<String, BaseEnum> {
    //获取消息转换器的方法:
    // springmvc调用handler方法时，如果handler需要的参数 类型是BaseEnum的实现，则使用 参数类型获取这个参数的转换器对象使用
    //targetType: 是BaseEnum的实现类，  例如：ItemType
    //           springmvc使用转换器工厂时，会为BaseEnum的每个实现类类型创建一个转换器对象
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        return new Converter<String, T>() {//创建一个消息转换器对象
            //根据参数值 获取 枚举对象的方法
            @Override
            public T convert(String source) {//source表示传入的参数值
//                targetType.getEnumConstants()  获取 枚举类中所有的枚举对象
                if(StringUtils.isEmpty(source)){
                    return null;
                }
                for (T enumConstant : targetType.getEnumConstants()) {
                    //enumConstant表示一个枚举对象，实现了BaseEnum接口，一定有getCode方法
                   if(enumConstant.getCode().toString().equals(source)){
                       return enumConstant;//返回匹配的枚举对象
                   }
                }
                throw new RuntimeException(source+" 没有匹配的枚举对象");
//                return null;
            }
        };
    }
}
